package com.azthink.chpater421.controller;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Calendar;

@Component//注册到DemoApplication 这个Spring容器中
@Aspect//LogAspect类是切面类
public class LogAspect {

    private final Logger logger = LoggerFactory.getLogger(LogAspect.class);

    /**
     * 格式：
     * execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
     */
//    括号中各个pattern分别表示：
//
//    修饰符匹配（modifier-pattern?）
//    返回值匹配（ret-type-pattern）可以为*表示任何返回值,全路径的类名等
//    类路径匹配（declaring-type-pattern?）
//    方法名匹配（name-pattern）可以指定方法名 或者 *代表所有, set* 代表以set开头的所有方法
//    参数匹配（(param-pattern)）可以指定具体的参数类型，多个参数间用“,”隔开，各个参数也可以用“*”来表示匹配任意类型的参数，如(String)表示匹配一个String参数的方法；(*,String) 表示匹配有两个参数的方法，第一个参数可以是任意类型，而第二个参数是String类型；可以用(..)表示零个或多个任意参数
//    异常类型匹配（throws-pattern?）
//    其中后面跟着“?”的是可选项
//    1）execution(* *(..))
//    表示匹配所有方法
//    2）execution(public * com. savage.service.UserService.*(..))
//    表示匹配com.savage.server.UserService中所有的公有方法
//    3）execution(* com.savage.server..*.*(..))
//    表示匹配com.savage.server包及其子包下的所有方法
    //切入点
    @Pointcut("execution(public * com.azthink.chpater421.controller.HelloController.*(..))")
    public void cut(){}

    //调用前执行
    @Before("cut()")
    public void doBefore(){
       
        System.out.println("调用开始时间: " + Calendar.getInstance().getTimeInMillis());
    }
    //调用后执行
    @After("cut()")
    public void doAfter(){
        System.out.println("调用结束时间: " + Calendar.getInstance().getTimeInMillis());
    }
    

}
